﻿// Inner Fire 游戏引擎库
// AssimpPrinter - Assimp打印器
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：应用层(4)
// 用于打印一个模型的信息
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-03-12

#pragma once

#include <assimp/Importer.hpp>
#include <assimp/postprocess.h> // 包含Assimp的后处理步骤
#include <assimp/scene.h>       // 包含Assimp的场景结构体
#include <string>
#include <graphics/vertex.h>
#include <eastl/map.h>
#include <EASTL/vector.h>
#include <EASTL/string.h>
#include <EASTL/string_view.h>

namespace ifire::game {

enum AssimpPrinterFlag {
  MESHES = 0x01,
  HIERARCHY = 0x02,
  SKELETON = 0x04,
  ANIMATION = 0x08,
  BONE_INFO = 0x10,
  STRUCTURE = 0x17, // 除去Animation信息的所有项目
  ALL = 0xFF // 所有项目
};

class AssimpPrinter {
public:
  AssimpPrinter(const eastl::string_view& path, AssimpPrinterFlag flag);
  AssimpPrinter(const aiScene* scene, AssimpPrinterFlag flag);
  ~AssimpPrinter() = default;

private:
  void Parse(const aiScene* scene, AssimpPrinterFlag flag);
  void ParseMeshes(const aiScene* scene);
  void ParseHierarchy(const aiScene* scene);
  void ParseSkeleton(const aiScene* scene);
  void ParseAnimation(const aiScene* scene);
  void ParseNode(const aiNode* pNode);
  void ParseMeshBones(int mesh_index, const aiMesh* pMesh);
  void ParseSingleBone(int mesh_index, const aiBone* pBone);
  int GetBoneId(const aiBone* pBone);
  void ParseBoneInfo();

private:
  eastl::vector<int> mesh_base_vertex_;
  eastl::vector<VertexBoneData> vertex_to_bones_;
  eastl::map<eastl::string, unsigned int> bone_name_index_map_;
};

} // namespace ifire::game